using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace UserLoginRegisterSystem
{
    /// <summary>
    /// 用户实体类（仅存储数据，无业务逻辑）
    /// </summary>
    public class User
    {
        // 用户名（满足3-15位，字母/数字/下划线）
        public string Username { get; }
        // 密码（满足6-20位，含大小写字母+数字）
        public string Password { get; }

        // 构造函数（仅初始化，数据校验在业务层处理）
        public User(string username, string password)
        {
            Username = username;
            Password = password;
        }
    }

    /// <summary>
    /// 用户业务逻辑类（处理注册、登录、数据验证）
    /// </summary>
    public class UserService
    {
        // 泛型集合存储注册用户（类型安全，支持动态操作）
        private readonly List<User> _registeredUsers = new List<User>();

        #region 注册功能（含完整数据验证）
        /// <summary>
        /// 用户注册（返回验证结果信息）
        /// </summary>
        public string Register(string username, string password, string confirmPassword)
        {
            // 1. 空值校验
            if (string.IsNullOrWhiteSpace(username))
                return "注册失败：用户名不可为空！";
            if (string.IsNullOrWhiteSpace(password))
                return "注册失败：密码不可为空！";
            if (string.IsNullOrWhiteSpace(confirmPassword))
                return "注册失败：确认密码不可为空！";

            // 2. 用户名规则校验（3-15位，字母/数字/下划线）
            var usernameRegex = new Regex(@"^[a-zA-Z0-9_]{3,15}$");
            if (!usernameRegex.IsMatch(username))
                return "注册失败：用户名需3-15个字符，仅含字母、数字或下划线！";

            // 3. 密码规则校验（6-20位，含大小写字母+数字）
            var passwordRegex = new Regex(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,20}$");
            if (!passwordRegex.IsMatch(password))
                return "注册失败：密码需6-20个字符，含至少1个大写字母、1个小写字母和1个数字！";

            // 4. 密码与确认密码一致性校验
            if (password != confirmPassword)
                return "注册失败：密码与确认密码不一致！";

            // 5. 用户名唯一性校验（foreach迭代查询）
            foreach (var user in _registeredUsers)
            {
                if (user.Username.Equals(username, StringComparison.OrdinalIgnoreCase))
                    return $"注册失败：用户名「{username}」已被占用！";
            }

            // 6. 所有校验通过，添加用户到集合
            _registeredUsers.Add(new User(username, password));
            return $"注册成功！用户名「{username}」已创建，可返回登录～";
        }
        #endregion

        #region 登录功能（含精准错误提示）
        /// <summary>
        /// 用户登录（返回登录结果信息）
        /// </summary>
        public string Login(string username, string password)
        {
            // 1. 空值校验
            if (string.IsNullOrWhiteSpace(username))
                return "登录失败：用户名不可为空！";
            if (string.IsNullOrWhiteSpace(password))
                return "登录失败：密码不可为空！";

            // 2. 查找用户（foreach迭代匹配）
            foreach (var user in _registeredUsers)
            {
                // 用户名不区分大小写，密码严格区分
                if (user.Username.Equals(username, StringComparison.OrdinalIgnoreCase))
                {
                    return user.Password == password 
                        ? $"登录成功！欢迎您，{user.Username}！\n\n===== 系统首页（模拟）=====\n1. 个人中心\n2. 功能列表\n3. 退出登录" 
                        : "登录失败：密码错误！";
                }
            }

            // 3. 未找到用户
            return "登录失败：用户名不存在！";
        }
        #endregion
    }

    /// <summary>
    /// 程序入口（处理菜单交互）
    /// </summary>
    class Program
    {
        public static void print()
        {
            var userService = new UserService();
            bool isRunning = true;

            Console.WriteLine("===== 欢迎使用用户登录注册系统 =====");

            // 主菜单循环
            while (isRunning)
            {
                Console.WriteLine("\n【主菜单】");
                Console.WriteLine("1. 登录");
                Console.WriteLine("2. 注册");
                Console.WriteLine("3. 退出");
                Console.Write("请选择操作（1-3）：");
                var input = Console.ReadLine()?.Trim();

                // 菜单选择处理（容错非数字输入）
                if (!int.TryParse(input, out int choice))
                {
                    Console.WriteLine("输入错误：请输入1-3之间的有效数字！");
                    continue;
                }

                switch (choice)
                {
                    case 1:
                        HandleLogin(userService); // 处理登录流程
                        break;
                    case 2:
                        HandleRegister(userService); // 处理注册流程
                        break;
                    case 3:
                        isRunning = false;
                        Console.WriteLine("系统已退出，感谢使用！");
                        break;
                    default:
                        Console.WriteLine("输入错误：请选择1-3之间的选项！");
                        break;
                }
            }

            Console.WriteLine("\n按任意键关闭窗口...");
            Console.ReadKey();
        }

        #region 辅助方法（封装输入交互逻辑）
        /// <summary>
        /// 处理登录输入流程
        /// </summary>
        private static void HandleLogin(UserService userService)
        {
            Console.WriteLine("\n===== 用户登录 =====");
            Console.Write("请输入用户名：");
            var username = Console.ReadLine()?.Trim();
            Console.Write("请输入密码：");
            var password = Console.ReadLine()?.Trim();

            // 调用登录方法并显示结果
            string result = userService.Login(username, password);
            Console.WriteLine($"\n{result}");

            // 登录成功后停留，便于查看系统首页
            if (result.Contains("登录成功"))
            {
                Console.WriteLine("\n按任意键返回主菜单...");
                Console.ReadKey();
            }
        }

        /// <summary>
        /// 处理注册输入流程
        /// </summary>
        private static void HandleRegister(UserService userService)
        {
            Console.WriteLine("\n===== 用户注册 =====");
            Console.Write("请输入用户名（3-15位，字母/数字/下划线）：");
            var username = Console.ReadLine()?.Trim();
            Console.Write("请输入密码（6-20位，含大小写字母+数字）：");
            var password = Console.ReadLine()?.Trim();
            Console.Write("请确认密码：");
            var confirmPassword = Console.ReadLine()?.Trim();

            // 调用注册方法并显示结果
            string result = userService.Register(username, password, confirmPassword);
            Console.WriteLine($"\n{result}");

            // 注册后停留，便于查看结果
            Console.WriteLine("\n按任意键返回主菜单...");
            Console.ReadKey();
        }
        #endregion
    }
}